package common.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import common.interf.IJValidator;

public class JValidatorImpl implements IJValidator {
	private Pattern pattern;
	private Matcher matcher;

	/**
	 * 验证空
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateEmpty(String str) {
		if (null == str || "".equals(str))
			return false;
		return true;
	}

	/**
	 * 检查内容攻击注入
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateAttack(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "<(img|iframe|script)[\\w| ]*(src) *=";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return(!matcher.find());
	}

	/**
	 * 检查内容过滤
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateLaw(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "(法 *轮 *功|独 *立|激 *情|暴 *力|裸 *体)";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return(!matcher.find());
	}

	/**
	 * 检查URL
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateUrl(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^((https|http|ftp|rtsp|mms)://)(\\w|\\W){3,}$";

		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查IP
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateIp(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^(([01]\\d{2})|(2(([0-4]\\d)|5[0-5]))|\\d{1,2})(\\.(([01]\\d{2})|(2(([0-4]\\d)|5[0-5]))|\\d{1,2})){3}$";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查固定电话
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateTel(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^0\\d{2,3}[1-9]\\d{6,7}$";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查电子邮箱
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateEmail(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^(\\w|\\-~)+@\\w+\\.\\w+$";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查移动电话
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMobile(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^1\\d{10}$";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查身份证号
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateIdno(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^(\\d{6})(18|19|20)?(\\d{2})([01]\\d)([0123]\\d)(\\d{3})(\\d|X)?$";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查邮编
	 * 
	 * @param str
	 *            检测的字符串
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateZipCode(String str) {
		if (str == null || str.length() == 0)
			return true;
		String scontent = "^\\d{6}$";
		pattern = Pattern.compile(scontent);
		matcher = pattern.matcher(str);
		return (matcher.matches());
	}

	/**
	 * 检查长度范围
	 * 
	 * @param str
	 *            检测的字符串 len1 最短长度 len2 最大长度
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateBetweenLength(String str, Integer len1, Integer len2) {
		if (null == str)
			return true;
		int len = str.length();
		if (len >= len1 && len <= len2)
			return true;
		return false;
	}

	/**
	 * 检查最大长度
	 * 
	 * @param str
	 *            检测的字符串 len1 最大长度
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMaxLength(String str, Integer len1) {
		if (null == str)
			return true;
		Integer len = str.length();
		if (len <= len1)
			return true;
		return false;
	}

	/**
	 * 检查最短长度
	 * 
	 * @param str
	 *            检测的字符串 len1 最短长度
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMinLength(String str, Integer len1) {
		if (null == str)
			return true;
		Integer len = str.length();
		if (len >= len1)
			return true;
		return false;
	}

	/**
	 * 检查值范围
	 * 
	 * @param v
	 *            要检测的值 min 最小值 max 最大值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateBetween(Double v, Double min, Double max) {
		if (v >= min && v <= max)
			return true;
		return false;
	}

	/**
	 * 检查最小值
	 * 
	 * @param v
	 *            要检测的值 min 最小值 max 最大值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMin(Double v, Double min) {
		if (v >= min)
			return true;
		return false;
	}

	/**
	 * 检查最大值
	 * 
	 * @param v
	 *            要检测的值 min 最小值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMax(Double v, Double max) {
		if (v <= max)
			return true;
		return false;
	}

	/**
	 * 检查值范围
	 * 
	 * @param v
	 *            要检测的值 min 最小值 max 最大值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateBetween(Integer v, Integer min, Integer max) {
		if (v >= min && v <= max)
			return true;
		return false;
	}

	/**
	 * 检查最小值
	 * 
	 * @param v
	 *            要检测的值 min 最小值 max 最大值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMin(Integer v, Integer min) {
		if (v >= min)
			return true;
		return false;
	}

	/**
	 * 检查最大值
	 * 
	 * @param v
	 *            要检测的值 min 最小值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateMax(Integer v, Integer max) {
		if (v <= max)
			return true;
		return false;
	}

	/**
	 * 检查日期
	 * 
	 * @param v
	 *            要检测的值
	 * 
	 * @return 通过 true 没通过 false
	 */
	public boolean validateDate(String v) {
		SimpleDateFormat sdf = new SimpleDateFormat();
		String[] patterns = new String[] { "yyyy-MM-dd", "MM/dd/yyyy",
				"yyyy/MM/dd" };
		for (int i = 0; i < patterns.length; i++) {
			sdf.applyPattern(patterns[i]);
			try {
				sdf.parse(v);
				return true;
			} catch (Exception e) {
				return false;	
			}
		}
		return false;
	}
	
	/**
	 * 文件格式
	 * @param v:value
	 * @param ft:文件类型字符串 如 doc,pdf,png,jpg
	 * @return 通过 true 没通过 false
	 */
	public boolean validateFileType(String v,String ft){
		ArrayList<String> al = new ArrayList<String>(0);
		//application
		if(v.contains("application")){
			if(v.equals("application/msword")){  //word
				al.add("doc");
				al.add("dot");
			}else if(v.equals("application/pdf"))  //pdf
				al.add("pdf");
			else if(v.equals("application/msexcel")){ //excel
				al.add("xls");
			}else if(v.equals("application/mspowerpoint")){ //powerpoint
				al.add("ppt");
				al.add("ppz");
				al.add("ppt");
				al.add("pps");
				al.add("pot");
			}else if(v.equals("application/xhtml+xml")){  //html
				al.add("htm");
				al.add("html");
				al.add("shtml");
				al.add("xhtml");
			}else if(v.equals("application/xml")){		//xml
				al.add("xml");
			}else if(v.equals("application/x-javascript")){	//js
				al.add("js");
			}else if(v.equals("application/zip")){		//zip
				al.add("zip");
			}else if(v.equals("application/x-shockwave-flash")){	//flash
				al.add("swf");
				al.add("cab");
			}
		}else if(v.contains("image")){	//image
			if(v.equals("image/gif"))		  			//gif
				al.add("gif");
			else if(v.equals("image/jpeg")){			//jpg
				al.add("jpeg");
				al.add("jpg");
				al.add("jpe");
			}
			else if(v.equals("image/png"))  			//png
				al.add("png");
			else if(v.equals("image/tiff")){  			//tiff
				al.add("tiff");
				al.add("tif");
			}
			else if(v.equals("image/x-icon"))  			//ico
				al.add("ico");
		}else if(v.contains("text")){	//text
			if(v.equals("text/css"))  					//css
				al.add("css");
			else if(v.equals("text/html")){  			//html
				al.add("htm");
				al.add("html");
				al.add("shtml");
			}
			else if(v.equals("text/javascript"))  		//js
				al.add("js");
			else if(v.equals("text/plain"))  			//txt
				al.add("txt");
			else if(v.equals("text/xml"))  				//xml
				al.add("xml");
		}else if(v.contains("video")){ //video
			if(v.equals("video/mpeg")){  				//mpg
				al.add("mpeg");
				al.add("mpg");
				al.add("mpe");
			}
			else if(v.equals("video/quicktime")){  		//quicktime
				al.add("qt");
				al.add("mov");
			}
			else if(v.equals("video/x-msvideo")){  		//avi
				al.add("avi");
			}
		}else if(v.contains("audio")){	//audio
			if(v.equals("audio/mpeg")){  				//mp3
				al.add("mp3");
			}
			else if(v.equals("audio/x-midi")){  		//mid
				al.add("midi");
				al.add("mid");
			}
			else if(v.equals("audio/x-mpeg")){  		//mp2
				al.add("mp2");
			}
			else if(v.equals("audio/x-wav")){  			//wav
				al.add("wav");
			}
			else if(v.equals("audio/x-dwf")){  			//dwf
				al.add("dwf");
			}
		}
		for(Iterator<String> ite = al.iterator();ite.hasNext();){
			if(ft.contains(ite.next()))
				return true;
		}
		return false;
	}
}
